package com.company.hrmadmin.modules.entity.dto.page;

import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 列表排序DTO对象
 *
 * @author Song, Wei
 * Date: 2022/4/15 11:41
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "列表查询DTO基类")
public class BaseListQueryDTO extends BaseQueryDTO {

    /**
     * 查询条件
     */
    @ApiModelProperty(value = "搜索栏查询条件")
    protected String searchCondition;

    /**
     * 排序字段条件
     */
    @ApiModelProperty(value = "排序字段列表")
    protected List<String> sortFieldList;

    /**
     * 排序类型 1 降序 其他升序
     */
    @ApiModelProperty(value = "排序类型列表 排序类型 1 降序，其他升序")
    protected List<Integer> sortTypeList;

    /**
     * 拼接出来的排序条件
     */
    @ApiModelProperty(hidden = true)
    protected String sortCondition;

    /**
     * 排序字段取值列表
     */
    @ApiModelProperty(hidden = true)
    protected List<String> sortFieldValueList;

    /**
     * 根据排序字段和排序类型列表生成排序ORDER BY语句
     */
    public void generateSortCondition() {
        StringBuilder sortCondition = new StringBuilder();
        List<String> sortFieldList = getSortFieldList();
        List<Integer> sortTypeList = getSortTypeList();
        if (!CollectionUtils.isEmpty(sortFieldList)) {
            // 检查排序值取值范围是否正确
            for (String field : sortFieldList) {
                // 如果不是取值返回内的数，抛出请求参数异常
                if (!getSortFieldValueList().contains(field)) {
                    throw new IllegalArgumentException("排序参数异常");
                }
            }
            // 如果没有传排序方式，那么全部按照降序排
            if (CollectionUtils.isEmpty(sortTypeList)) {
                sortTypeList = new ArrayList<>();
                for (int i = 0; i < sortFieldList.size(); i++) {
                    sortTypeList.add(1);
                }
            }
            // 如果有传排序方式
            if (!CollectionUtils.isEmpty(sortTypeList)) {
                for (int i = 0; i < sortFieldList.size(); i++) {
                    sortCondition.append(sortFieldList.get(i)).append(" ");
                    if (sortTypeList.get(i) != null) {
                        // 排序方式只有这两种
                        if (sortTypeList.get(i) == 1) {
                            sortCondition.append("DESC");
                        } else {
                            // 传其他的默认为升序
                            sortCondition.append("ASC");
                        }
                    }
                    if (i < sortFieldList.size() - 1) {
                        sortCondition.append(",");
                    }
                }
                // 拼接排序参数
                setSortCondition(sortCondition.toString());
            }
        }
    }

    public BaseListQueryDTO() {
        sortFieldList = Lists.newArrayList();
        sortTypeList = Lists.newArrayList();
    }
}
